package com.xinggq.pay.service.pay.channel.yse.utils;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.atomic.AtomicLong;

/**
 * @Description
 * @Author xinggq
 * @Date 2025/9/9
 */
public class YseOutTradeNoUtil {

  /**
   * 原子计数器，确保线程安全的序列号生成
   */
  private static final AtomicLong COUNTER = new AtomicLong(0);

  /**
   * 计数器最大值，超过后重置为0
   */
  private static final long MAX_COUNTER = 9999L;

  /**
   * 生成外部订单号
   * 格式：yyyyMMddHHmmss + 4位原子计数器
   * 使用AtomicLong确保线程安全，性能优于synchronized
   */
  public static String createTradeNo() {
    return getDateTime() + getSequence();
  }


  /**
   * 生成时间戳
   */
  private static String getDateTime() {
    DateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
    return sdf.format(new Date());
  }


  /**
   * 获取4位序列号
   * 使用原子计数器确保线程安全和唯一性
   */
  private static String getSequence() {
    long current = COUNTER.getAndIncrement();
    // 超过最大值时重置计数器
    if (current > MAX_COUNTER) {
      COUNTER.compareAndSet(current, 0);
      current = COUNTER.getAndIncrement();
    }
    return String.format("%04d", current);
  }


}
